From c68029b778e8fa93b4148e512dceea8ca4dd74b1 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 2 Sep 2010 14:47:02 +0200 Subject: [PATCH] API: ruler: Change draw_ticks vfunc We now pass in a cairo_t of the backbuffer and the width and height of the widget/backbuffer, so the vfunc has a place to draw to. --- gtk/gtkruler.c | 47 ++++++++++++++++++++++++++++------------------- gtk/gtkruler.h | 3 ++- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/gtk/gtkruler.c b/gtk/gtkruler.c index 72693f5e61..3437327db9 100644 --- a/gtk/gtkruler.c +++ b/gtk/gtkruler.c @@ -88,7 +88,8 @@ static gboolean gtk_ruler_motion_notify (GtkWidget *widget, static gboolean gtk_ruler_expose (GtkWidget *widget, GdkEventExpose *event); static void gtk_ruler_make_pixmap (GtkRuler *ruler); -static void gtk_ruler_real_draw_ticks (GtkRuler *ruler); +static void gtk_ruler_real_draw_ticks (GtkRuler *ruler, + cairo_t *cr); static void gtk_ruler_real_draw_pos (GtkRuler *ruler); @@ -437,10 +438,20 @@ gtk_ruler_get_range (GtkRuler *ruler, void gtk_ruler_draw_ticks (GtkRuler *ruler) { + GtkRulerPrivate *priv = ruler->priv; + cairo_t *cr; + g_return_if_fail (GTK_IS_RULER (ruler)); + if (priv->backing_store == NULL) + return; + + cr = cairo_create (priv->backing_store); + if (GTK_RULER_GET_CLASS (ruler)->draw_ticks) - GTK_RULER_GET_CLASS (ruler)->draw_ticks (ruler); + GTK_RULER_GET_CLASS (ruler)->draw_ticks (ruler, cr); + + cairo_destroy (cr); } void @@ -633,14 +644,14 @@ gtk_ruler_make_pixmap (GtkRuler *ruler) } static void -gtk_ruler_real_draw_ticks (GtkRuler *ruler) +gtk_ruler_real_draw_ticks (GtkRuler *ruler, + cairo_t *cr) { - GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (ruler); GtkRulerPrivate *priv = ruler->priv; GtkStyle *style; - cairo_t *cr; gint i, j; + gint w, h; gint width, height; gint xthickness; gint ythickness; @@ -659,11 +670,7 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) PangoLayout *layout; PangoRectangle logical_rect, ink_rect; - if (!gtk_widget_is_drawable (widget)) - return; - style = gtk_widget_get_style (widget); - gtk_widget_get_allocation (widget, &allocation); xthickness = style->xthickness; ythickness = style->ythickness; @@ -674,20 +681,22 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) digit_height = PANGO_PIXELS (ink_rect.height) + 2; digit_offset = ink_rect.y; + w = gtk_widget_get_allocated_width (widget); + h = gtk_widget_get_allocated_height (widget); + if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { - width = allocation.width; - height = allocation.height - ythickness * 2; + width = w; + height = h - ythickness * 2; } else { - width = allocation.height; - height = allocation.width - ythickness * 2; + width = h; + height = w - ythickness * 2; } #define DETAILE(private) (priv->orientation == GTK_ORIENTATION_HORIZONTAL ? "hruler" : "vruler"); - cr = cairo_create (priv->backing_store); gdk_cairo_set_source_color (cr, &style->fg[gtk_widget_get_state (widget)]); gtk_cairo_paint_box (style, cr, @@ -696,14 +705,14 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) priv->orientation == GTK_ORIENTATION_HORIZONTAL ? "hruler" : "vruler", 0, 0, - allocation.width, allocation.height); + w, h); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_rectangle (cr, xthickness, height + ythickness, - allocation.width - 2 * xthickness, + w - 2 * xthickness, 1); } else @@ -712,7 +721,7 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) height + xthickness, ythickness, 1, - allocation.height - 2 * ythickness); + h - 2 * ythickness); } upper = priv->upper / priv->metric->pixels_per_unit; @@ -799,6 +808,7 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) height + xthickness - length, pos, length, 1); } + cairo_fill (cr); /* draw label */ if (i == 0) @@ -842,9 +852,8 @@ gtk_ruler_real_draw_ticks (GtkRuler *ruler) } cairo_fill (cr); -out: - cairo_destroy (cr); +out: g_object_unref (layout); } diff --git a/gtk/gtkruler.h b/gtk/gtkruler.h index f3ebf0ce3b..9e999e5a8b 100644 --- a/gtk/gtkruler.h +++ b/gtk/gtkruler.h @@ -75,7 +75,8 @@ struct _GtkRulerClass { GtkWidgetClass parent_class; - void (* draw_ticks) (GtkRuler *ruler); + void (* draw_ticks) (GtkRuler *ruler, + cairo_t *cr); void (* draw_pos) (GtkRuler *ruler); /* Padding for future expansion */ -- 2.30.2